#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : 05_set_demo.py
# @Time : 2023/6/29 16:51
# -------------------------------

"""
集合的定义：
1. 无序的唯一对象集合
2. 用大括号{}包围，对象相互之间使用逗号隔开
3. 集合是动态的，可以随时添加或删除元素
4. 集合是异构的，可以包含不同类型的数据

"""

# 创建集合
# 1. 通过使用{}填充元素
# set1 = {1, 3, 5}
# print(type(set1), set1)
# 2. 构造方法set()
# set2 = set('hogwarts')
# print(type(set2), set2)
# set3 = set([1,2,3])
# print(type(set3), set3)
# set4 = set()
# print(set4, type(set4))     # 空的集合对象

# 3. 通过集合推导式
# set5 = {i for i in range(5) if i % 2 == 0}
# print(set5, type(set5))

"""支持in 或者not in 方法，判断元素是否在集合中存在"""

"""集合方法
add():添加方法至集合之中
update():批量添加来自可迭代对象中的所有元素
remove():从集合中移除指定元素 item
discard():从集合中移除指定元素，若不存在也不会报错
pop():随机从集合中移除并返回一个元素，若集合为空则会引发keyerror
clear():清空集合，返回None值
"""
''' add(item)'''
# set7 = set()
# set7.add(1)
# set7.add('hogwarts')
# print(set7)       #  {1, 'hogwarts'}

# update(itera)
# set7.update('hogwarts')
# print(set7,type(set7))  # {'r', 'o', 't', 's', 'g', 'a', 'h', 'w'} <class 'set'>
# set7.update([1,3,5])
# # {1, 'h', 3, 'r', 5, 's', 'w', 'o', 'g', 'a', 't'} <class 'set'>
# print(set7,type(set7))

'''remove(item)'''
# set8 = {1, 2, 'hogwarts'}
# set8.remove(1)
# print(set8) #{2, 'hogwarts'}
# 删除不存在的元素会报错
# set8.remove(100)
# print(set8)
# 输出结果
# Traceback (most recent call last):
#   File "D:\study\Huogewozi\git_prac\git-demo\pythonCode\05_set_demo.py", line 59, in <module>
#     set8.remove(100)
# KeyError: 100
# ---------------------------------
'''discard(item)'''
# set8.discard(100)
# print(set8) #{2, 'hogwarts'}

'''pop()'''
# 随机删除某个对象
# str = {1, 2, 3, 4, 5, 'hogwarts'}
# item = str.pop()
# print(item, str)

# 集合本身为空，会报错
# st = set()
# st.pop()    #KeyError: 'pop from an empty set'

'''clear()清除所有元素，返回None'''
# str = {1, 3, 4, 'happy'}
# st = str.clear()
# print(str, st)

'''集合运算'''
# a = {2,3,4}
# b = {1,2,3}
# # 1. 交集运算， intersection()
# print(a.intersection(b))
# print(a & b)
# # 2. 并集运算，union()
# print(a.union(b))
# print(a | b)
# # 3. 差集运算
# print(b.difference(a))
# print(b - a)

'''集合推导式'''
"""
类似于列表推导式，同样集合支持集合推导式
语法：{x for x in ... if ...}
实例：寻找hogwarts 与 hello world的的相同字母
"""
set10  = set()
for s in 'hogwarts':
    if s in "hello world":
        set10.add(s)
print(set10)
# {'o', 'h', 'w', 'r'}

set11 = {s for s in "hogwarts" if s in 'hello world'}
print(set11)
# {'o', 'h', 'w', 'r'}